/*
 * 版权所有 (C) 2018 知启蒙(ZHIQIM) 保留所有权利。
 * 
 * 欢迎到知启蒙网站（https://www.zhiqim.com）购买正版软件，知启蒙还提供许多开源框架和软件。
 * 
 * 1、本软件产品所有源代码受《中华人民共和国著作权法》和其他有关法律、法规的保护，其所有知识产权归湖南知启蒙科技有限公司所有；
 * 2、禁止复制和修改。不得复制修改、翻译或改编本软件所有源代码，或者基于本软件产品创作衍生作品；
 * 3、禁止进行逆向工程。不得对本软件的源代码进行逆向工程、反编译或试图以其他方式发现软件的源代码；
 * 4、个别授权：如需进行商业性的销售、复制、分发，包括但不限于软件销售、预装、捆绑等，必须获得知启蒙的书面授权和许可；
 * 5、保留权利：本注释未明示授权的其他一切权利仍归知启蒙所有，任何人使用其他权利时必须获得知启蒙的书面同意。
 */
package net.redxyz.repost.service.dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import net.redxyz.top.TaobaoService;
import net.redxyz.top.data.item.Item;
import net.redxyz.top.data.shop.SellerCat;
import net.redxyz.top.message.item.ItemSellerGetResponse4_24625;
import net.redxyz.top.message.item.ItemsInventoryGetResponse4_162;
import net.redxyz.top.message.item.ItemsOnsaleGetResponse4_18;

import org.zhiqim.kernel.constants.SignConstants;
import org.zhiqim.kernel.paging.PageBuilder;
import org.zhiqim.kernel.paging.PageResult;
import org.zhiqim.kernel.util.Lists;
import org.zhiqim.kernel.util.Strings;
import org.zhiqim.kernel.util.Urls;
import org.zhiqim.kernel.util.Validates;
import org.zhiqim.orm.dbo.Selector;

/**
 * 宝贝数据访问对象
 *
 * @version v1.0.0 @author zouzhigang 2014-3-21 新建与整理
 */
public class ItemDao
{
    private static String OUTER_ID_SCOPE =  SignConstants._LETTERS_DIGITS_ + "+-_";
    
    /**
     * 指定查询条件
     * 
     * @param selector 查询器
     * @param q 查询条件
     */
    public static void addWhereQ(Selector selector, String q)
    {
        if(Validates.isEmpty(q))
            return;
        
        long numIid = ItemDao.getNumIidFromQ(q);
        if (numIid != -1)
            selector.addMaybe("numIid", numIid);
        else if (ItemDao.isOuterIdFromQ(q))
            selector.addMaybe("outerId", q);
        else
            selector.addMaybeLike("title", q);
    }
    
    /**
     * 指定列表，查出符合条件的宝贝
     * 
     * @param itemList 原列表
     * @param q 条件
     * @return 新列表
     */
    public static List<Item> queryItemList(List<Item> itemList, String q)
    {
        if (Validates.isEmpty(q))
            return itemList;
        
        //先查宝贝ID和宝贝链接
        List<Item> iList = new ArrayList<Item>();
        long iid = getNumIidFromQ(q);
        if (iid != -1)
        {
            for (Item item : itemList)
            {
                if (item.getNumIid() == iid)
                {
                    iList.add(item);
                    return iList;
                }
            }
            
            //没匹配到返回空列表
            return iList;
        }
            
        //再查商品编码，有则返回
        if (isOuterIdFromQ(q))
        {
            for (Item item : itemList)
            {
                if (q.equals(item.getOuterId()))
                    iList.add(item);
            }
            
            if (!iList.isEmpty())
                return iList;
        }
        
        //最后查标题
        for (Item item : itemList)
        {
            if (item.getTitle().indexOf(q) != -1)
            {
                iList.add(item);
            }
        }
        
        return iList;
    }
    
    /**
     * 指定分页查询出售中宝贝，用于描述安装
     * 
     * @param itemList 查询到宝贝放置到列表中
     * @param nick 用户昵称
     * @param sessionId 会话
     * @param sellerCid 分类
     * @param q 查询条件
     * @param page 页码
     * @param pageSize 页数
     * @return 查询到最记录数
     * @throws Exception
     */
    public static int getItemListOnsalePage(List<Item> itemList, String nick, String sessionId, String sellerCid, String q, int page, int pageSize) throws Exception
    {
        //先查宝贝ID和宝贝链接，查到返回1，未查询到返回0
        long iid = getNumIidFromQ(q);
        if (iid != -1)
        {
            ItemSellerGetResponse4_24625 resp = TaobaoService.getItemService().getItem(nick, sessionId, iid);
            if (resp.isSuccess())
            {
                Item item = resp.getItem();
                if (item.isOnsale() && nick.equals(item.getNick()))
                {
                    itemList.add(item);
                    return 1;
                }
            }
            
            return 0;
        }
        
        //再查商品编码，如果有则返回，没查到再查一次标题
        if (isOuterIdFromQ(q))
        {
            List<Item> oList = getItemListOuterId(nick, sessionId, q, true, false);
            if (!oList.isEmpty())
            {//表示查询到
                int total = 0;
                for (Item item : oList)
                {
                    if (item.isOnsale())
                    {
                        itemList.add(item);
                        total++;
                    }
                }
                
                return total;
            }
        }

        //最后查标题
        ItemsOnsaleGetResponse4_18 resp = TaobaoService.getItemService().getOnsaleItemList(nick, sessionId, page, pageSize, sellerCid, q);
        itemList.addAll(resp.getItemList());

        return resp.getTotalResults();
    }
    
    /**
     * 指定分页查询仓库中宝贝
     * 
     * @param itemList 查询到宝贝放置到列表中
     * @param nick 用户昵称
     * @param sessionId 会话
     * @param sellerCid 分类
     * @param banner 类型
     * @param q 查询条件
     * @param page 页码
     * @param pageSize 页数
     * @return 查询到最记录数
     * @throws Exception
     */
    public static int getItemListInventoryPage(List<Item> itemList, String nick, String sessionId, String sellerCid, String banner, String q, int page, int pageSize) throws Exception
    {
        //先查宝贝ID和宝贝链接，查到返回1，未查询到返回0
        long iid = getNumIidFromQ(q);
        if (iid != -1)
        {
            ItemSellerGetResponse4_24625 resp = TaobaoService.getItemService().getItem(nick, sessionId, iid);
            if (resp.isSuccess())
            {
                Item item = resp.getItem();
                if (item.isInstock() && nick.equals(item.getNick()))
                {
                    itemList.add(item);
                    return 1;
                }
            }
            
            return 0;
        }
        
        //再查商品编码，如果有则返回，没查到再查一次标题
        if (isOuterIdFromQ(q))
        {
            List<Item> oList = getItemListOuterId(nick, sessionId, q, true, false);
            if (!oList.isEmpty())
            {
                int total = 0;
                for (Item item : oList)
                {
                    if (item.isInstock())
                    {
                        itemList.add(item);
                        total++;
                    }
                }
                
                return total;
            }
        }

        //最后查标题
        ItemsInventoryGetResponse4_162 resp = TaobaoService.getItemService().getInventoryItemList(nick, sessionId, page, pageSize, sellerCid, banner, q);
        itemList.addAll(resp.getItemList());

        return resp.getTotalResults();
    }
    
    /**
     * 指定分页查询出售中宝贝，用于描述安装
     * 
     * @param itemList 查询到宝贝放置到列表中
     * @param nick 用户昵称
     * @param sessionId 会话
     * @param sellerCid 分类
     * @param q 查询条件
     * @param page 页码
     * @param pageSize 页数
     * @return 查询到最记录数
     * @throws Exception
     */
    public static int getItemListShowPage(List<Item> itemList, String nick, String sessionId, String sellerCid, String q, int page, int pageSize) throws Exception
    {
        //先查宝贝ID和宝贝链接，查到返回1，未查询到返回0
        long iid = getNumIidFromQ(q);
        if (iid != -1)
        {
            ItemSellerGetResponse4_24625 resp = TaobaoService.getItemService().getItem(nick, sessionId, iid);
            if (resp.isSuccess())
            {
                Item item = resp.getItem();
                if (item.isShowcase() && nick.equals(item.getNick()))
                {
                    itemList.add(item);
                    return 1;
                }
            }
            
            return 0;
        }
        
        //再查商品编码，如果有则返回，没查到再查一次标题
        if (isOuterIdFromQ(q))
        {
            List<Item> oList = getItemListOuterId(nick, sessionId, q, true, false);
            if (!oList.isEmpty())
            {//表示查到则返回
                int total = 0;
                for (Item item : oList)
                {
                    if (item.isShowcase())
                    {
                        itemList.add(item);
                        total++;
                    }
                }
                
                return total;
            }
        }

        //最后查标题
        ItemsOnsaleGetResponse4_18 resp = TaobaoService.getItemService().getShowcaseItemList(nick, sessionId, page, pageSize, sellerCid, q);
        itemList.addAll(resp.getItemList());

        return resp.getTotalResults();
    }
    
   
    /**
     * 指定条件，查询宝贝信息，查全部宝贝信息，支持出售中和仓库中两种
     * 
     * @param nick 用户昵称
     * @param sessionId 会话
     * @param sellerCid 分类
     * @param q 查询条件
     * @param isOnsale 出售中
     * @param isInventory 仓库中
     * @return 返回查询列表
     * @throws Exception
     */
    public static List<Item> getItemListAll(String nick, String sessionId, String sellerCid, String q, boolean isOnsale, boolean isInventory) throws Exception
    {
        if (isOnsale && isInventory)
        {//出售中和仓库中都查询
            
            //先查宝贝ID和宝贝链接
            long iid = getNumIidFromQ(q);
            if (iid != -1)
            {
                List<Item> itemList = new ArrayList<Item>();
                ItemSellerGetResponse4_24625 resp = TaobaoService.getItemService().getItem(nick, sessionId, iid);
                if (resp.isSuccess())
                {
                    Item item = resp.getItem();
                    if (nick.equals(item.getNick()))
                        itemList.add(item);//自己的宝贝
                }
                
                return itemList;
            }
            
            //再查商品编码，如果有则返回，没查到再查一次标题
            if (isOuterIdFromQ(q))
            {
                List<Item> itemList = getItemListOuterId(nick, sessionId, q, isOnsale, isInventory);
                if (!itemList.isEmpty())
                    return itemList;
            }
            
            List<Item> itemList = new ArrayList<Item>();
            List<Item> oList = TaobaoService.getItemService().getOnsaleItemListAll(nick, sessionId, sellerCid, q);
            List<Item> iList = TaobaoService.getItemService().getInventoryItemListAll(nick, sessionId, sellerCid, q);
            itemList.addAll(oList);
            itemList.addAll(iList);
            return itemList;
        }
        else
        {//查个查询
            List<Item> itemList = new ArrayList<Item>();
            if (isOnsale)
                itemList.addAll(getItemListAllOnsale(nick, sessionId, sellerCid, q));
            
            if (isInventory)
                itemList.addAll(getItemListAllInventory(nick, sessionId, sellerCid, q));
            
            return itemList;
        }
    }
    
    /**
     * 指定条件，查询宝贝信息，查全部宝贝信息，支持出售中和仓库中两种
     * 
     * @param nick 用户昵称
     * @param sessionId 会话
     * @param sellerCid 分类
     * @param q 查询条件
     * @param isOnsale 出售中
     * @param isInventory 仓库中
     * @return 返回查询列表
     * @throws Exception
     */
    public static PageResult<Item> getItemPage(String nick, String sessionId, String sellerCid, String q, boolean isOnsale, boolean isInventory, List<Long> filterIidList, int pageNo, int pageSize) throws Exception
    {
        if (isOnsale && isInventory)
        {//出售中和仓库中都查询
            
            //先查宝贝ID和宝贝链接
            long iid = getNumIidFromQ(q);
            if (iid != -1)
            {
                List<Item> itemList = new ArrayList<Item>();
                ItemSellerGetResponse4_24625 resp = TaobaoService.getItemService().getItem(nick, sessionId, iid);
                if (resp.isSuccess())
                {
                    Item item = resp.getItem();
                    if (nick.equals(item.getNick()) && !filterIidList.contains(item.getNumIid()))
                        itemList.add(item);//自己的宝贝，且不在过滤中
                }
                
                return PageBuilder.pageResult(pageNo, pageSize, itemList);
            }
            
            //再查商品编码，如果有则返回，没查到再查一次标题
            if (isOuterIdFromQ(q))
            {
                List<Item> itemList = getItemListOuterId(nick, sessionId, q, isOnsale, isInventory);
                if (!itemList.isEmpty())
                {
                    for (Iterator<Item> it=itemList.iterator();it.hasNext();)
                    {//去除包含的
                        Item item = it.next();
                        if (filterIidList.contains(item.getNumIid()))
                            it.remove();
                    }
                    
                    return PageBuilder.pageResult(pageNo, pageSize, itemList);
                }
            }
            
            List<Item> itemList = new ArrayList<Item>();
            //计算总数，并查出一页
            itemList.addAll(TaobaoService.getItemService().getOnsaleItemListAll(nick, sessionId, sellerCid, q));
            itemList.addAll(TaobaoService.getItemService().getInventoryItemListAll(nick, sessionId, sellerCid, "", q));
            for (Iterator<Item> it=itemList.iterator();it.hasNext();)
            {
                Item item = it.next();
                if (filterIidList.contains(item.getNumIid()))
                    it.remove();
            }
            
            return PageBuilder.pageResult(pageNo, pageSize, itemList);
        }
        else
        {//查个查询
            if (isOnsale)
                return getItemPageOnsale(nick, sessionId, sellerCid, q, filterIidList, pageNo, pageSize);
            
            if (isInventory)
                return getItemPageInventory(nick, sessionId, sellerCid, q, filterIidList, pageNo, pageSize);
            
            throw new Exception("请选择出售中或仓库中选项");
        }
    }
    
    /**
     * 指定条件，查询宝贝信息，查所有出售中宝贝
     * 
     * @param nick 用户昵称
     * @param sessionId 会话
     * @param sellerCid 分类
     * @param q 查询条件
     * @return 返回查询列表
     * @throws Exception
     */
    public static List<Item> getItemListAllOnsale(String nick, String sessionId, String sellerCid, String q) throws Exception
    {
        //先查是否是宝贝编号或宝贝链接，8-11位数字
        long iid = getNumIidFromQ(q);
        if (iid != -1)
        {
            List<Item> itemList = new ArrayList<Item>();
            ItemSellerGetResponse4_24625 resp = TaobaoService.getItemService().getItem(nick, sessionId, iid);
            if (resp.isSuccess())
            {
                Item item = resp.getItem();
                if (item.isOnsale() && nick.equals(item.getNick()))
                    itemList.add(item);
            }
            
            return itemList;
        }
        
        //再查是否是商品编码，查到则返回，没查到则最后查标题
        if (isOuterIdFromQ(q))
        {
            List<Item> itemList = getItemListOuterId(nick, sessionId, q, true, false);
            if (!itemList.isEmpty())
                return itemList;
        }
        
        //最后查标题
        return TaobaoService.getItemService().getOnsaleItemListAll(nick, sessionId, sellerCid, q);
    }
    
    /**
     * 指定条件，查询宝贝信息，查所有出售中宝贝
     * 
     * @param nick 用户昵称
     * @param sessionId 会话
     * @param sellerCid 分类
     * @param q 查询条件
     * @return 返回查询列表
     * @throws Exception
     */
    public static PageResult<Item> getItemPageOnsale(String nick, String sessionId, String sellerCid, String q, List<Long> filterIidList, int pageNo, int pageSize) throws Exception
    {
        //先查是否是宝贝编号或宝贝链接，8-11位数字
        long iid = getNumIidFromQ(q);
        if (iid != -1)
        {
            List<Item> itemList = new ArrayList<Item>();
            ItemSellerGetResponse4_24625 resp = TaobaoService.getItemService().getItem(nick, sessionId, iid);
            if (resp.isSuccess())
            {
                Item item = resp.getItem();
                if (item.isOnsale() && nick.equals(item.getNick()) && !filterIidList.contains(item.getNumIid()))
                    itemList.add(item);
            }
            
            return PageBuilder.pageResult(pageNo, pageSize, itemList);
        }
        
        //再查是否是商品编码，查到则返回，没查到则最后查标题
        if (isOuterIdFromQ(q))
        {
            List<Item> itemList = getItemListOuterId(nick, sessionId, q, true, false);
            if (!itemList.isEmpty())
            {
                for (Iterator<Item> it=itemList.iterator();it.hasNext();)
                {//去除包含的
                    Item item = it.next();
                    if (filterIidList.contains(item.getNumIid()))
                        it.remove();
                }
                
                return PageBuilder.pageResult(pageNo, pageSize, itemList);
            }
        }
        
        //最后查标题
        List<Item> itemList = TaobaoService.getItemService().getOnsaleItemListAll(nick, sessionId, sellerCid, q);
        for (Iterator<Item> it=itemList.iterator();it.hasNext();)
        {
            Item item = it.next();
            if (filterIidList.contains(item.getNumIid()))
                it.remove();
        }
        
        return PageBuilder.pageResult(pageNo, pageSize, itemList);
    }
    
    /**
     * 指定条件，查询宝贝信息，查所有仓库中宝贝
     * 
     * @param nick 用户昵称
     * @param sessionId 会话
     * @param sellerCid 分类
     * @param q 查询条件
     * @return 返回查询列表
     * @throws Exception
     */
    private static List<Item> getItemListAllInventory(String nick, String sessionId, String sellerCid, String q) throws Exception
    {
        //先查是否是宝贝编号或宝贝链接，8-11位数字
        long iid = getNumIidFromQ(q);
        if (iid != -1)
        {
            List<Item> itemList = new ArrayList<Item>();
            ItemSellerGetResponse4_24625 resp = TaobaoService.getItemService().getItem(nick, sessionId, iid);
            if (resp.isSuccess())
            {
                Item item = resp.getItem();
                if (item.isInstock() && nick.equals(item.getNick()))
                    itemList.add(item);
            }
            
            return itemList;
        }
        
        //再查是否是商品编码，查到则返回，没查到则最后查标题
        if (isOuterIdFromQ(q))
        {
            List<Item> itemList = getItemListOuterId(nick, sessionId, q, false, true);
            if (!itemList.isEmpty())
                return itemList;
        }
        
        //最后查标题
        return TaobaoService.getItemService().getInventoryItemListAll(nick, sessionId, sellerCid, q);
    }
    
    /**
     * 指定条件，查询宝贝信息，查所有仓库中宝贝
     * 
     * @param nick 用户昵称
     * @param sessionId 会话
     * @param sellerCid 分类
     * @param q 查询条件
     * @return 返回查询列表
     * @throws Exception
     */
    private static PageResult<Item> getItemPageInventory(String nick, String sessionId, String sellerCid, String q, List<Long> filterIidList, int pageNo, int pageSize) throws Exception
    {
        //先查是否是宝贝编号或宝贝链接，8-11位数字
        long iid = getNumIidFromQ(q);
        if (iid != -1)
        {
            List<Item> itemList = new ArrayList<Item>();
            ItemSellerGetResponse4_24625 resp = TaobaoService.getItemService().getItem(nick, sessionId, iid);
            if (resp.isSuccess())
            {
                Item item = resp.getItem();
                if (item.isInstock() && nick.equals(item.getNick()) && !filterIidList.contains(item.getNumIid()))
                    itemList.add(item);
            }
            
            return PageBuilder.pageResult(pageNo, pageSize, itemList);
        }
        
        //再查是否是商品编码，查到则返回，没查到则最后查标题
        if (isOuterIdFromQ(q))
        {
            List<Item> itemList = getItemListOuterId(nick, sessionId, q, false, true);
            if (!itemList.isEmpty())
            {
                for (Iterator<Item> it=itemList.iterator();it.hasNext();)
                {//去除包含的
                    Item item = it.next();
                    if (filterIidList.contains(item.getNumIid()))
                        it.remove();
                }
                
                return PageBuilder.pageResult(pageNo, pageSize, itemList);
            }
        }
        
        //最后查标题
        List<Item> itemList = TaobaoService.getItemService().getInventoryItemListAll(nick, sessionId, sellerCid, "", q);
        for (Iterator<Item> it=itemList.iterator();it.hasNext();)
        {
            Item item = it.next();
            if (filterIidList.contains(item.getNumIid()))
                it.remove();
        }

        return PageBuilder.pageResult(pageNo, pageSize, itemList);
    }
    
    private static List<Item> getItemListOuterId(String nick, String sessionId, String outerId, boolean isOnsale, boolean isInventory) throws Exception
    {
        List<Item> itemList = TaobaoService.getItemService().getItemsByOuterId(nick, sessionId, outerId);
        if (itemList.isEmpty() || (isOnsale && isInventory))
            return itemList;
        
        List<Item> iList = new ArrayList<Item>();
        for (Item item : itemList)
        {
            if (isOnsale && item.isOnsale())
                iList.add(item);
            
            if (isInventory && item.isInstock())
                iList.add(item);
        }
        
        return iList;
    }
    
    public static long getNumIidFromQ(String q)
    {
        long numIid = -1;
        if (Validates.isNumericLen(q, 10, 20))
            numIid = Long.parseLong(q);
        else if (Strings.startsWithIgnoreCase(q, "http://") || Strings.startsWithIgnoreCase(q, "https://"))
        {
            String id = Urls.get(q, "id");
            if (Validates.isNumericLen(id, 10, 20))
                numIid = Long.parseLong(id);
        }
        
        return numIid;
    }
    
    public static boolean isOuterIdFromQ(String q)
    {
        return Validates.isScope(q, OUTER_ID_SCOPE);
    }
    
    /**
     * 获取用户自定义类目
     * @param nick
     * @param sessionId
     * @return
     * @throws Exception
     */
    public static List<SellerCat> getSellercatsList(String nick, String sessionId) throws Exception
    {
        List<SellerCat> sellerCats = TaobaoService.getShopService().getSellercatsList(nick, sessionId);
        
        Map<Integer, List<Integer>> map = new HashMap<>();
        for (SellerCat sellerCat : sellerCats)
        {
            List<Integer> subCids = new ArrayList<>();
            subCids.add(sellerCat.getCid());
            map.put(sellerCat.getCid(), subCids);
        }
        
        for (SellerCat sellerCat : sellerCats)
        {
            if (sellerCat.getParentCid() != 0)
                map.get(sellerCat.getParentCid()).add(sellerCat.getCid());
        }
        
        for (SellerCat sellerCat : sellerCats)
        {
            int cid = sellerCat.getCid();
            List<Integer> cidList = map.get(cid);
            String cids = Lists.toString(cidList, ",");
            sellerCat.setCids(cids);
        }
        
        return sellerCats;
    }
}
